package storm2;// -*- codeing: utf-8 -*-

// @Time     :2021/12/10 15:21
// @Author   :郭荣杰
//@File      :JRedisUtil.java
//@Software  : IntelliJ IDEA

import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.storm.Config;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * redis通用工具类
 *
 */
public class JRedisUtil {
    private JedisPool pool = null;

    public static class RedisService{
        //127.0.0.1
        //192.168.179.140
        private static JRedisUtil redis = new JRedisUtil("127.0.0.1",6379);
    }

    public static JRedisUtil getJRedis(){
        return RedisService.redis;
    }

    public JRedisUtil(){
    }
    /**
     * <p>传入ip和端口号构建redis 连接池</p>
     * @param ip ip
     * @param prot 端口
     */
    public JRedisUtil(String ip, int prot) {
        if (pool == null) {
//            JedisPoolConfig poolConfig = new JedisPoolConfig.Builder()
//                .setHost("127.0.0.1").setPort(6379).build();
            JedisPoolConfig config = new JedisPoolConfig();
            // 控制一个pool可分配多少个jedis实例，通过pool.getResource()来获取；
            // 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
            config.setMaxTotal(500);
            // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
            config.setMaxIdle(10);
            // 表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException；
            config.setMaxWaitMillis(1000 * 100);
            // 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
            config.setTestOnBorrow(true);
            pool = new JedisPool(config, ip, prot, 100000);
        }
    }

    /**
     * <p>通过配置对象 ip 端口 构建连接池</p>
     * @param config 配置对象
     * @param ip ip
     * @param prot 端口
     */
    public JRedisUtil(JedisPoolConfig config ,String ip, int prot){
        if (pool == null) {
            pool = new JedisPool(config,ip,prot,10000);
        }
    }

    /**
     * <p>通过配置对象 ip 端口 超时时间 构建连接池</p>
     * @param config 配置对象
     * @param ip ip
     * @param prot 端口
     * @param timeout 超时时间
     */
    public JRedisUtil(JedisPoolConfig config ,String ip, int prot ,int timeout){
        if (pool == null) {
            pool = new JedisPool(config,ip,prot,timeout);
        }
    }

    /**
     * <p>通过连接池对象 构建一个连接池</p>
     * @param pool 连接池对象
     */
    public JRedisUtil(JedisPool pool){
        if (this.pool == null) {
            this.pool = pool;
        }
    }

    /**
     * <p>向redis存入key和value,并释放连接资源</p>
     * <p>如果key已经存在 则覆盖</p>
     * @param key
     * @param value
     * @return 成功 返回OK 失败返回 0
     */
    public void set(String key,String value){
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            jedis.set(key, value);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            returnResource(pool, jedis);
        }
    }
    /**
     * <p>通过key给指定的value加值,如果key不存在,则这是value为该值</p>
     * @param key
     * @param integer
     *
     */
    public void incrBy(String key,int integer){
        Jedis jedis = null;

        try {
            jedis = pool.getResource();
            jedis.incrBy(key, integer);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            returnResource(pool, jedis);
        }

    }
    /**
     * <p>通过key给指定的value加值,如果key不存在,则这是value为该值</p>
     * @param key
     * @param score
     *
     */
    public void incrBy(String key,double score){
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            jedis.incrByFloat(key,score);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            returnResource(pool, jedis);
        }

    }
    /**
     * <p>通过key增加该zset中value的score的值</p>
     * @param key
     * @param score
     * @param member
     * @return
     */
    public void zincrby(String key ,int score ,String member){
        Jedis jedis = null;
//        Double res = null;
        try {
            jedis = pool.getResource();
            jedis.zincrby(key, score, member);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            returnResource(pool, jedis);
        }
//        return res;
    }
    /**
     * 返还到连接池
     *
     * @param pool
     * @param jedis
     */
    public static void returnResource(JedisPool pool, Jedis jedis) {
        if (jedis != null) {
            pool.returnResource(jedis);
        }
    }

}
